package service

import (
	"context"
	"fmt"
	"github.com/example/video_backend/internal/model"
	"github.com/example/video_backend/internal/repository"
	"github.com/example/video_backend/pkg/minio"

	"mime/multipart"
)

// ImageService 图片服务接口
type ImageService interface {
	// UploadImage 上传图片
	UploadImage(ctx context.Context, file *multipart.FileHeader, title, description string, userID uint) (*model.Image, error)
	// BatchUploadImages 批量上传图片
	BatchUploadImages(ctx context.Context, files []*multipart.FileHeader, title, description string, userID uint) ([]*model.Image, error)
	// GetImageList 获取图片列表
	GetImageList(ctx context.Context, page, pageSize int, userID *uint) ([]*model.Image, int64, error)
	// GetImageByID 获取图片详情
	GetImageByID(ctx context.Context, id uint) (*model.Image, error)
	// UpdateImage 更新图片信息
	UpdateImage(ctx context.Context, image *model.Image) error
	// DeleteImage 删除图片
	DeleteImage(ctx context.Context, id uint) error
	// IncrementImageViews 增加图片浏览量
	IncrementImageViews(ctx context.Context, id uint) error
}

// imageService 图片服务实现
type imageService struct {
	imageRepo repository.ImageRepository
}

// NewImageService 创建图片服务实例
func NewImageService(imageRepo repository.ImageRepository) ImageService {
	return &imageService{
		imageRepo: imageRepo,
	}
}

// UploadImage 上传图片
func (s *imageService) UploadImage(ctx context.Context, file *multipart.FileHeader, title, description string, userID uint) (*model.Image, error) {
	// 上传图片到MinIO
	imageURL, err := minio.UploadFile(ctx, file, "images/")
	if err != nil {
		return nil, err
	}

	// 创建图片记录
	image := &model.Image{
		Title:       title,
		Description: description,
		ImageURL:    imageURL,
		UserID:      userID,
		IsPublic:    true,
	}

	// 保存到数据库
	if err := s.imageRepo.Create(ctx, image); err != nil {
		// 如果保存失败，删除已上传的图片
		minio.DeleteFile(ctx, imageURL)
		return nil, err
	}

	return image, nil
}

// GetImageList 获取图片列表
func (s *imageService) GetImageList(ctx context.Context, page, pageSize int, userID *uint) ([]*model.Image, int64, error) {
	return s.imageRepo.List(ctx, page, pageSize, userID)
}

// GetImageByID 获取图片详情
func (s *imageService) GetImageByID(ctx context.Context, id uint) (*model.Image, error) {
	return s.imageRepo.GetByID(ctx, id)
}

// UpdateImage 更新图片信息
func (s *imageService) UpdateImage(ctx context.Context, image *model.Image) error {
	return s.imageRepo.Update(ctx, image)
}

// DeleteImage 删除图片
func (s *imageService) DeleteImage(ctx context.Context, id uint) error {
	// 获取图片信息
	image, err := s.imageRepo.GetByID(ctx, id)
	if err != nil {
		return err
	}

	// 删除数据库记录
	if err := s.imageRepo.Delete(ctx, id); err != nil {
		return err
	}

	// 删除MinIO中的图片文件
	minio.DeleteFile(ctx, image.ImageURL)

	return nil
}

// IncrementImageViews 增加图片浏览量
func (s *imageService) IncrementImageViews(ctx context.Context, id uint) error {
	return s.imageRepo.IncrementViews(ctx, id)
}

// BatchUploadImages 批量上传图片
func (s *imageService) BatchUploadImages(ctx context.Context, files []*multipart.FileHeader, title, description string, userID uint) ([]*model.Image, error) {
	var images []*model.Image
	var uploadedImages []string

	for i, file := range files {
		// 上传单个图片文件到MinIO
		imageURL, err := minio.UploadFile(ctx, file, "images/")
		if err != nil {
			// 删除已经上传的图片
			for _, url := range uploadedImages {
				minio.DeleteFile(ctx, url)
			}
			return nil, err
		}

		// 记录已上传的图片URL
		uploadedImages = append(uploadedImages, imageURL)

		// 生成图片标题（如果有多张图片，为标题添加序号）
		imageTitle := title
		if len(files) > 1 {
			imageTitle = fmt.Sprintf("%s (%d/%d)", title, i+1, len(files))
		}

		// 创建图片记录
		image := &model.Image{
			Title:       imageTitle,
			Description: description,
			ImageURL:    imageURL,
			UserID:      userID,
			IsPublic:    true,
		}

		// 保存图片信息到数据库
		if err := s.imageRepo.Create(ctx, image); err != nil {
			// 删除已经上传的图片
			for _, url := range uploadedImages {
				minio.DeleteFile(ctx, url)
			}
			return nil, err
		}

		images = append(images, image)
	}

	return images, nil
}
